package com.cskaoyan.javse.oop3._2inner._2static._0introduction;

/**
 * @description: 静态内部类的基本特点
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * > 思考：怎么把一个普通成员变成一个静态成员？
 * - 静态内部类也是处在外围类成员位置的内部类，不同的是它需要使用static修饰
 * - 语法：
 *   [访问权限修饰符] class EnclosedClazz{ //外围（普通）类的访问权限修饰符，只有两个，public和缺省
 *   	[访问权限修饰符] static class InnerClazz{//内部类访问权限修饰符，有四个，和普通成员一样
 *       }
 *   }
 *
 * 静态内部类自身的特点
 * 1，访问权限修饰符
 *      静态内部类仍然处在成员位置,它仍然具有四种访问权限
 *      这一点和成员内部类是没有区别的
 *
 *
 *  在理解静态内部类的成员特点之前,我们也要先明确几个点:
 *      a.成员内部类可以看成是一个类的成员,那么静态内部类是否可以看成一个类的静态成员呢?
 *          可以看成,也可以不看成
 *          我的建议是不要看成,因为它们联系不大
 *      b.静态内部类的类加载机制:
 *          静态内部类本身就是一个独立的类,创建对象触发类加载,访问静态成员触发类加载,这些都是可以的
 *
 *  Oracle公司官网有一段文字解释静态内部类和成员内部类的区别:
 *      Nested classes that are declared static are called static nested classes. Non-static nested classes are called inner classes.
 *      被声明为static的嵌套类称之为静态嵌套类(静态内部类),没有static声明的嵌套类叫做内部类(成员内部类)
 *      什么叫Nested,什么叫inner
 *      嵌套关系是指直接将一个东西放进另一个东西的内部,这两个东西本身可以没有任何关系,本身可以是独立的
 *      所以静态内部类的这种嵌套关系就是这样的:
 *          一个类本身可以独立的做一个类,但是为了保护自己,隐藏自己,将这个类放入另一个类的内部,这种情况下,外围类和静态内部类没有强依赖关系
 *      而内部类,inner的关系指的是本身它们就是一体的,而且内部类是不能脱离外围类而存在的,就像CPU和电脑,心脏和身体
 *      inner是一种强依赖关系,而成员内部类和外围类正是这种关系
 *
 *      所以:
 *          静态内部类和外围类,除了外围类可以保护隐藏静态内部类外,它们之间没有任何关系,创建对象不会互相影响,(创建对象的)类加载也不会互相影响
 *
 * 2，成员特点
 *      和普通类没有任何区别
 *
 * 3，继承和实现
 *      和普通类也一样,但是需要注意它被外围类保护,需要考虑外围类
 *      并且在外围类的内部去继承一个类时,这个类也必须是静态内部类,不能是成员内部类
 *
 *
 */
public class Demo {
    public static void main(String[] args) {

    }
}

class EnclosedClazz {

    static class A {
    }

    class B {
    }

    //静态内部类
    static class StaticClazz extends A {
        int a;
        static int b = 10;
        static final int C = 20;

        static void test() {
        }

        static {
        }

        {
        }

        public StaticClazz() {
        }

        public StaticClazz(int a) {
            this.a = a;
        }
    }
}
